/*
 * Copyright (C) 2011 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.example.android.newsreader.frameAux;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import com.example.android.newsreader.previo.ExpressionBuilder;
import com.example.android.newsreader.previo.Preguntas;
import com.example.android.newsreader.previo.adapters.AdapterPregunatAbierta;
import com.example.android.newsreader.previo.adapters.HolderPregunta;
import com.example.android.newsreader.previo.base.ManagerDB;
import com.example.android.newsreader.previo.clases.encuesta.Applicacion;
import com.example.android.newsreader.previo.clases.encuesta.Opcion;
import com.example.android.newsreader.previo.clases.encuesta.Pregunta;
import com.example.android.newsreader.previo.clases.encuesta.Respuesta;
import com.example.android.newsreader.previo.clases.encuesta.Seccion;
import com.example.android.newsreader.previo.clases.encuesta.Validacion;

import android.app.AlertDialog;
import android.app.DatePickerDialog;
import android.app.TimePickerDialog;
import android.app.TimePickerDialog.OnTimeSetListener;
import android.content.DialogInterface;
import android.graphics.Color;
import android.os.Bundle;
import android.renderscript.Script;
import android.support.v4.app.Fragment;
import android.text.InputType;
import android.util.DisplayMetrics;
import android.util.SparseBooleanArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.webkit.WebView;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;

import com.example.android.newsreader.R;

/**
 * Fragment that displays a news article.
 */
public class ArticleFragment extends Fragment implements OnClickListener,
OnItemClickListener{
    // The webview where we display the article (our only view)
 
   
    private Calendar c = Calendar.getInstance();
	private ManagerDB manager;
	private Pregunta currentPregunta=null;
	private ImageButton next, previous,save;
 
	private ListView opcionesMultiple;
	private TextView encabezado, subEnc;
	private EditText pAbierta,time, fecha,txtOtro;	
	private Applicacion app;
	private int totalP = 0;
	HeadlinesFragment mHeadlinesFragment=null;
	private ScrollView tAbierta;
  
	
	private boolean bandera=false;

    // Parameterless constructor is needed by framework
    public ArticleFragment() {
        super();
       
    }
   
    /**
     * Sets up the UI. It consists if a single WebView.
     */
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    	 	
    	
        View view =inflater.inflate(R.layout.layout_preguntas, container, false);
       
        next = (ImageButton) view.findViewById(R.id.btnNext);
		previous = (ImageButton) view.findViewById(R.id.btnPrev);
		save = (ImageButton) view.findViewById(R.id.btnsave);
		
		time = (EditText) view.findViewById(R.id.btnTime);
		fecha = (EditText) view.findViewById(R.id.btnDate);
		opcionesMultiple = (ListView) view.findViewById(R.id.listOpc);
		encabezado = (TextView) view.findViewById(R.id.txtEncabezado);
		subEnc = (TextView) view.findViewById(R.id.txtSubEncabezado);
		pAbierta = (EditText) view.findViewById(R.id.txtabierta);
		txtOtro = (EditText) view.findViewById(R.id.txtotro);
		tAbierta = (ScrollView) view.findViewById(R.id.scrolTabierta);
		
	 
	    manager = new ManagerDB(getActivity());
		
	    if(currentPregunta==null){
		    currentPregunta = new Pregunta();
			currentPregunta.setSeccion(getActivity().getIntent().getStringExtra("idSecc"));
			currentPregunta.setSecuencia("0");
			currentPregunta.setIdPregunta(getActivity().getIntent().getStringExtra("idPregunta"));
	
			app = manager.getApplicacionById(getActivity().getIntent().getStringExtra("idApp"));
			currentPregunta = manager.getPreguntaById(currentPregunta.getIdPregunta(),
					app.getIdAplicacion());
			bandera=true;
	    }
		next.setOnClickListener(this);
		previous.setOnClickListener(this);
		save.setOnClickListener(this);
		fecha.setOnClickListener(this);
		time.setOnClickListener(this);
		
		    boolean mIsDualPane = getResources().getBoolean(R.bool.has_two_panes);
			if(mIsDualPane){
				 mHeadlinesFragment = (HeadlinesFragment) getActivity().getSupportFragmentManager().findFragmentById(R.id.headlines);
		 
			}
		buildPregunta();
		totalP = manager.getTotalPreguntasBySeccion(getActivity().getIntent().getStringExtra(
				"idSecc"));
        
    	return view;
    	
    }

    /**
     * Displays a particular article.
     *
     * @param article the article to display
     */
    public void displayArticle(String idPregunta) { 
    	 if(!bandera) {
    	currentPregunta = manager.getPreguntaById(idPregunta,app.getIdAplicacion());    	
        buildPregunta();
        
        }else{bandera=false;}
    }

    /**
     * Loads article data into the webview.
     *
     * This method is called internally to update the webview's contents to the appropriate
     * article's text.
     */
   
    
    
public void setFecha(final View v) {
	
        
        
		new DatePickerDialog(getActivity(), new DatePickerDialog.OnDateSetListener() {

			public void onDateSet(DatePicker view, int year, int monthOfYear,
					int dayOfMonth) {

				String month = monthOfYear + "";
				String day = dayOfMonth + "";
				if (monthOfYear < 10)
					month = "0" + monthOfYear;
				if (dayOfMonth < 10)
					day = "0" + dayOfMonth;

				((EditText) v).setText(year +  "-" + month + "-"  + day  );

			}
		}, c.get(Calendar.YEAR), c.get(Calendar.MONTH),
				c.get(Calendar.DAY_OF_MONTH)).show();

	}

	public void setTime(final View v) {

		TimePickerDialog tm = new TimePickerDialog(getActivity(),
				new OnTimeSetListener() {

					public void onTimeSet(TimePicker view, int hourOfDay,
							int minute) {
						String h = hourOfDay + "";
						String m = minute + "";
						if (hourOfDay < 10)
							h = "0" + hourOfDay;
						if (minute < 10)
							m = "0" + minute;

						((EditText) v).setText(h + ":" + m);

					}
				}, c.get(Calendar.HOUR), c.get(Calendar.MINUTE), true);
		tm.show();

	}

	public void buildPregunta() {
		encabezado.setText((Integer.parseInt(currentPregunta.getTipoPregunta()) >= 4)?currentPregunta.getSubseccionInfo():currentPregunta.getTexto());
		
		subEnc.setText((Integer.parseInt(currentPregunta.getTipoPregunta()) >= 4)?currentPregunta.getTexto():currentPregunta.getTextoAuxiliar());

		hideElements();
		
		
		 if (currentPregunta.getOtro()!=null) {
			 txtOtro.setVisibility(View.VISIBLE);
			 
			 if(currentPregunta.getRespuesta()!=null){
			 txtOtro.setText(currentPregunta.getRespuesta().getRespuestaTexto());			
			 }
		 }		
				
		
		if (currentPregunta.getTipoPregunta().equals("1")) {
				
			
				if (currentPregunta.getValidacion().getTipoDato().equals("1")){
					pAbierta.setVisibility(View.VISIBLE);
					if (currentPregunta.getRespuesta() != null) 
					pAbierta.setText(currentPregunta.getRespuesta()
							.getRespuestaTexto());
					
				}else if (currentPregunta.getValidacion().getTipoDato()
						.equals("2")){
					pAbierta.setVisibility(View.VISIBLE);
					pAbierta.setInputType(InputType.TYPE_CLASS_NUMBER);
					if (currentPregunta.getRespuesta() != null) 
					pAbierta.setText(currentPregunta.getRespuesta()
							.getRespuestaNumero());
				}else{
					time.setVisibility(View.VISIBLE);
					fecha.setVisibility(View.VISIBLE);
					if (currentPregunta.getRespuesta() != null){ 
						String vec[]=currentPregunta.getRespuesta().getRespuestaFecha().split("T");
						fecha.setText(vec[0]);
						time.setText(vec[1]);
					}
				}
			

		} else if (currentPregunta.getTipoPregunta().equals("2")
				|| currentPregunta.getTipoPregunta().equals("4")) {
			opcionesMultiple.setVisibility(View.VISIBLE);

			final List<Opcion> vecaux = currentPregunta.getOpciones();

			ArrayAdapter<Opcion> arr = new ArrayAdapter<Opcion>(getActivity(),
					android.R.layout.simple_list_item_single_choice, vecaux) {

				@Override
				public View getView(int position, View convertView,
						android.view.ViewGroup parent) {

					View view = super.getView(position, convertView, parent);

					Opcion entry = vecaux.get(position);
					TextView text1 = (TextView) view
							.findViewById(android.R.id.text1);
					text1.setTextColor(Color.BLACK);
					text1.setText(entry.toString());
					
					
					
					if(getActivity().getResources().getBoolean(R.bool.has_two_panes)){		
						DisplayMetrics metrics = getContext().getResources().getDisplayMetrics();
						float dp = 20f;
						float fpixels = metrics.density * dp;
						text1.setTextSize(fpixels);
					}
					
					
					
					return view;
				}
			};

			opcionesMultiple.setAdapter(arr);
			opcionesMultiple.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
			inicializarListview();
			

		}else if (currentPregunta.getTipoPregunta().equals("3") || currentPregunta.getTipoPregunta().equals("5")) {
			opcionesMultiple.setVisibility(View.VISIBLE);

			final List<Opcion> vecaux = currentPregunta.getOpciones();
			ArrayAdapter<Opcion> arr = new ArrayAdapter<Opcion>(getActivity(),
					android.R.layout.simple_list_item_multiple_choice, vecaux) {

				@Override
				public View getView(int position, View convertView,
						android.view.ViewGroup parent) {

					View view = super.getView(position, convertView, parent);

					Opcion entry = vecaux.get(position);
					TextView text1 = (TextView) view
							.findViewById(android.R.id.text1);
					text1.setTextColor(Color.BLACK);
					text1.setText(entry.toString());

					if(getActivity().getResources().getBoolean(R.bool.has_two_panes)){		
						DisplayMetrics metrics = getContext().getResources().getDisplayMetrics();
						float dp = 20f;
						float fpixels = metrics.density * dp;
						text1.setTextSize(fpixels);
					}
					
					return view;
				}
			};

			opcionesMultiple.setAdapter(arr);
			opcionesMultiple.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
			opcionesMultiple.setOnItemClickListener(this);
			inicializarListview();
		}else if (currentPregunta.getTipoPregunta().equals("6")) {
			
			/*opcionesMultiple.setVisibility(View.VISIBLE);
			final List<Opcion> vecaux = currentPregunta.getOpciones();
			AdapterPregunatAbierta arr = new AdapterPregunatAbierta(getActivity(),(ArrayList<Opcion>)vecaux);			
			opcionesMultiple.setAdapter(arr);		*/
			
			this.cargarListaTablaAvierta();
						
		}
		
		

	}

	public void hideElements() {
		opcionesMultiple.setVisibility(View.GONE);
		fecha.setVisibility(View.GONE);
		time.setVisibility(View.GONE);
		pAbierta.setVisibility(View.GONE);
	    txtOtro.setVisibility(View.GONE);
	    tAbierta.setVisibility(View.GONE);
	    txtOtro.setText("");
	    pAbierta.setText("");
	    time.setText("");
	    fecha.setText("");
	    pAbierta.setInputType(InputType.TYPE_CLASS_TEXT);
	    	
        boolean band=false;
		/*if (currentPregunta.getSecuencia().equals("1"))
			previous.setImageDrawable(getResources().getDrawable(
					R.drawable.save));
		else
			previous.setImageDrawable(getResources().getDrawable(
					R.drawable.previous));*/
	    		
		
		if (manager.getPreviusPreguntaTabla(currentPregunta, app.getIdAplicacion()) == null)
			if (manager.getPreviusPregunta(currentPregunta, app.getIdAplicacion()) == null){
				save.setVisibility(View.GONE);
				previous.setImageDrawable(getResources().getDrawable(R.drawable.save));
				band=true;
			}
			else{
				previous.setImageDrawable(getResources().getDrawable(
						R.drawable.previous));
				save.setVisibility(View.VISIBLE);
				}
		else{
			previous.setImageDrawable(getResources().getDrawable(R.drawable.previous));
			save.setVisibility(View.VISIBLE);
			}
		
		
		

		if (manager
				.getNextPreguntaTabla(currentPregunta, app.getIdAplicacion()) == null)
			if (manager.getNextPregunta(currentPregunta, app.getIdAplicacion()) == null){
				next.setImageDrawable(getResources().getDrawable(R.drawable.save));
				save.setVisibility(View.GONE);
				}
			else{
				next.setImageDrawable(getResources().getDrawable(R.drawable.next));
				if(!band)
				save.setVisibility(View.VISIBLE);	
			}
		else{
			next.setImageDrawable(getResources().getDrawable(R.drawable.next));
			if(!band)
			save.setVisibility(View.VISIBLE);
			}

	}

	public void GoNext() {
		Pregunta paux = null;

		paux = manager.getNextPreguntaTabla(currentPregunta,
				app.getIdAplicacion());
		if (paux != null) {
			currentPregunta = paux;
			buildPregunta();
		}

		if (paux == null) {
			paux = manager.getNextPregunta(currentPregunta,
					app.getIdAplicacion());
			if (paux != null) {
				currentPregunta = paux;
				buildPregunta();

			}
		}

	}

	public void GoPrev() {
		Pregunta paux = null;

		paux = manager.getPreviusPreguntaTabla(currentPregunta,
				app.getIdAplicacion());
		if (paux != null) {
			currentPregunta = paux;
			buildPregunta();

		}

		if (paux == null) {
			paux = manager.getPreviusPregunta(currentPregunta,
					app.getIdAplicacion());
			if (paux != null) {
				
				if(Integer.parseInt(paux.TipoPregunta )> 3){
					currentPregunta = manager.getLastPreguntaTabla(paux,app.getIdAplicacion());;
					buildPregunta();
				}else{
					currentPregunta = paux;
					buildPregunta();
				}	
					

			}
		}

	}

	public void onClick(View v) {
		if (v.getId() == R.id.btnNext && validaPregunta()) {
			saveRespuesta();
			GoNext();

		} else if (v.getId() == R.id.btnPrev && validaPregunta()) {
			saveRespuesta();
			GoPrev();
		}else if (v.getId() == R.id.btnDate) {
			this.setFecha(v);
		}else if (v.getId() == R.id.btnTime) {
			this.setTime(v);
			
		}else if (v.getId() == R.id.btnsave && validaPregunta()) {
			saveRespuesta();			
		}
		
	}

	public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
		SparseBooleanArray checked = opcionesMultiple.getCheckedItemPositions();
        final Opcion opc=(Opcion)opcionesMultiple.getAdapter().getItem(arg2);
		int count = 0;
		for (int i = 0; i < opcionesMultiple.getCount(); i++)
			if (checked.get(i))
				count++;

		if (count > Integer
				.parseInt(currentPregunta.getNumeroOpSeleccionable())) {
			Toast.makeText(
					getActivity(),
					"Seleccionar Maximo "
							+ currentPregunta.getNumeroOpSeleccionable()
							+ " Opciones", Toast.LENGTH_LONG).show();
			opcionesMultiple.setItemChecked(arg2, false);
		}else if(opc.getOtro()!=null && checked.get(arg2)){
			
			AlertDialog.Builder alert = new AlertDialog.Builder(getActivity());

			alert.setTitle("Especificar la opcion otro");
			alert.setMessage("Introducir el valor para la opcion otro.");

			// Set an EditText view to get user input 
			final EditText input = new EditText(getActivity());			
			input.setText(opc.getTextoOtro());
			alert.setView(input);

			alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog, int whichButton) {
			  String value = input.getText().toString();
			   opc.setTextoOtro(value);			  
			  }
			});

			
			alert.show();
						
			
		}
			

	}

	public void saveRespuesta() {

				
		if (currentPregunta.getTipoPregunta().equals("1")) {
			Respuesta resAux = new Respuesta();
			resAux.setIdAplicacion(app.getIdAplicacion());
			resAux.setIdPregunta(currentPregunta.getIdPregunta());
			resAux.setIdOpcion("-1");
			if (currentPregunta.getValidacion().getTipoDato().equals("1")) {
				resAux.setRespuestaTexto(pAbierta.getText().toString());
			} else if (currentPregunta.getValidacion().getTipoDato()
					.equals("2")) {
				resAux.setRespuestaNumero(pAbierta.getText().toString());
			} else if (currentPregunta.getValidacion().getTipoDato()
					.equals("3")) {
				resAux.setRespuestaFecha(fecha.getText().toString()+"T"+time.getText().toString());		

			}
			manager.deleteRespuestasByPregunta(currentPregunta.getIdPregunta(),
					app.getIdAplicacion());
			manager.insertRespuesta(resAux);

		} else if(currentPregunta.getTipoPregunta().equals("6")){
			manager.deleteRespuestasByPregunta(currentPregunta.getIdPregunta(),
					app.getIdAplicacion());
			
			
			if(currentPregunta.getOtro()!=null){
				Respuesta resAux = new Respuesta();
				resAux.setIdAplicacion(app.getIdAplicacion());
				resAux.setIdPregunta(currentPregunta.getIdPregunta());
				resAux.setRespuestaTexto(txtOtro.getText().toString());
				resAux.setIdOpcion("-1");
				manager.insertRespuesta(resAux);
			}
			
			
			   for(Opcion opc: currentPregunta.getOpciones()) {
				
					
					
					//HolderPregunta hold =(HolderPregunta)opcionesMultiple.getChildAt(i).getTag();
					
					EditText edit= (EditText) tAbierta.findViewById(Integer.parseInt(opc.getIdOpcion())); 
					
					
					Respuesta resAux = new Respuesta();
					resAux.setIdAplicacion(app.getIdAplicacion());
					resAux.setIdPregunta(currentPregunta.getIdPregunta());
					resAux.setIdOpcion(opc.getIdOpcion());
					resAux.setRespuestaTexto(edit.getText().toString());
					manager.insertRespuesta(resAux);
				}	
			
		}
		else  {
			manager.deleteRespuestasByPregunta(currentPregunta.getIdPregunta(),
					app.getIdAplicacion());
			
			if(currentPregunta.getOtro()!=null){
				Respuesta resAux = new Respuesta();
				resAux.setIdAplicacion(app.getIdAplicacion());
				resAux.setIdPregunta(currentPregunta.getIdPregunta());	
				resAux.setRespuestaTexto(txtOtro.getText().toString());
				resAux.setIdOpcion("-1");
				manager.insertRespuesta(resAux);
			}
			
			
			SparseBooleanArray checked = opcionesMultiple
					.getCheckedItemPositions();
			
			for (int i = 0; i < opcionesMultiple.getCount(); i++)
				if (checked.get(i)) {
					Opcion opc = (Opcion) opcionesMultiple.getAdapter()
							.getItem(i);
					Respuesta resAux = new Respuesta();
					resAux.setIdAplicacion(app.getIdAplicacion());
					resAux.setIdPregunta(currentPregunta.getIdPregunta());
					resAux.setIdOpcion(opc.getIdOpcion());
					resAux.setRespuestaTexto(opc.getTextoOtro());
					manager.insertRespuesta(resAux);
				}
			
			

		}
        
		if(mHeadlinesFragment!=null)
			mHeadlinesFragment.loadCategory(0);

		
	}

	public void inicializarListview() {

		for (int i = 0; i < opcionesMultiple.getCount(); i++)
			if (((Opcion) opcionesMultiple.getAdapter().getItem(i))
					.getRespuesta() != null) {
				opcionesMultiple.setItemChecked(i, true);
			}

	}
	
	
	
    
   public void cargarListaTablaAvierta(){
	   tAbierta.setVisibility(View.VISIBLE);
	   ((LinearLayout)tAbierta.findViewById(R.id.layoutTabierta)).removeAllViews();
	   for (Opcion op: currentPregunta.getOpciones()) {
			TextView txt = new TextView(getActivity());			
			txt.setText(op.getTexto());			
			
			DisplayMetrics metrics = getActivity().getResources().getDisplayMetrics();
			float dp = 20f;
			float fpixels = metrics.density * dp;
			txt.setTextSize(fpixels);
			
			EditText edit = new EditText(getActivity());
			edit.setId(Integer.parseInt(op.getIdOpcion()));
			edit.setHint(op.getTexto());
			
			if(op.getRespuesta()!=null)
			    edit.setText(op.getRespuesta().getRespuestaTexto());
			
			((LinearLayout)tAbierta.findViewById(R.id.layoutTabierta)).addView(txt);
			((LinearLayout)tAbierta.findViewById(R.id.layoutTabierta)).addView(edit);
		   
		}	   
	   
   }
   
   
   public boolean validaPregunta(){
		boolean requerida = currentPregunta.getRequerida().equals("1");
		int tipo = Integer.parseInt(currentPregunta.getTipoPregunta());
		Validacion val = currentPregunta.getValidacion();
		boolean returnValue = true;
		
			if(tipo==1){
				int dato = Integer.parseInt(val.getTipoDato());
				if(dato==1||dato==2){
					String resp = pAbierta.getText().toString();
					if(resp.length()<=0&&requerida){
						returnValue= false;
						Toast.makeText(getActivity(),"Se requiere una respuesta",Toast.LENGTH_SHORT).show();}
					if(dato==1){if(val.getMascara().length()>0){
						String exp = ExpressionBuilder.process(val.getMascara());
						if(exp.contains("ERROR")){Toast.makeText(getActivity(), "Error en mascara: "+val.getMascara(),Toast.LENGTH_LONG).show();}
						else{returnValue=resp.matches(exp);Toast.makeText(getActivity(), "Error,formato incorrecto: "+val.getMascara(),Toast.LENGTH_SHORT).show();}
					}}else{
						
						if(val.getValorFinal().equals("")&&val.getValorInicial().equals(""))
						if(Integer.parseInt(resp)<Integer.parseInt(val.getValorInicial())||
						   Integer.parseInt(resp)>Integer.parseInt(val.getValorFinal())){
							returnValue=false;
							Toast.makeText(getActivity(), "Valor fuera de rango, min:"+val.getValorInicial()+" max:"+val.getValorFinal(),Toast.LENGTH_SHORT).show();}
					}
				}
				else if(dato==3){
					if(fecha.getText().toString().equals("")||time.getText().toString().equals("")){		
						if(requerida){
							returnValue= false;
							Toast.makeText(getActivity(), "Se requiere una respuesta", Toast.LENGTH_SHORT).show();}
					}else{
						//VALIDA FECHA
					}
				}				
			}else if(tipo!=6){
				SparseBooleanArray checked = opcionesMultiple.getCheckedItemPositions();
				if(requerida){returnValue=false;
				for (int i = 0; i < opcionesMultiple.getCount(); i++)
					if (checked.get(i))
						returnValue=true;
				if(!returnValue)Toast.makeText(getActivity(), "Se requiere al menos una respuesta", Toast.LENGTH_SHORT).show();}
			}

			return returnValue;
		}

        
}
